package me.weyye.todaynews.utils;
import android.util.Base64;
import com.orhanobut.logger.Logger;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.CRC32;
import me.weyye.todaynews.base.ApiService;
import me.weyye.todaynews.base.AppClient;
import me.weyye.todaynews.base.ResultResponse;
import me.weyye.todaynews.model.Video;
import me.weyye.todaynews.model.VideoModel;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by Administrator on 2017/2/9 0009.
*/
public abstract class VideoPathDecoder {
public void decodePath(final String srcUrl) {
AppClient.getApiService().getVideoHtml(srcUrl)
// Observable.just(videoId)
.flatMap(new Func1<String, Observable<ResultResponse<VideoModel>>>() {
@Override
public Observable<ResultResponse<VideoModel>> call(String response) {
Pattern pattern = Pattern.compile("videoid:\'(.+)\'");
Matcher matcher = pattern.matcher(response);
if (matcher.find()) {
String videoId = matcher.group(1);
Logger.i(videoId);
//将/video/urls/v/1/toutiao/mp4/{videoid}?r={Math.random()},进行crc32加密。
String r = getRandom();
CRC32 crc32 = new CRC32();
String s = String.format(ApiService.URL_VIDEO, videoId, r);
crc32.update(s.getBytes());
String crcString = crc32.getValue() + "";
String url = ApiService.HOST_VIDEO + s + "&s=" + crcString;
Logger.i(url);
return AppClient.getApiService().getVideoData(url);
}
return null;
}
})
.map(new Func1<ResultResponse<VideoModel>, Video>() {
@Override
public Video call(ResultResponse<VideoModel> videoModelResultResponse) {
VideoModel.VideoListBean data = videoModelResultResponse.data.video_list;
if (data.video_3 != null) {
return updateVideo(data.video_3);
}
if (data.video_2 != null) {
return updateVideo(data.video_2);
}
if (data.video_1 != null) {
return updateVideo(data.video_1);
}
return null;
}
private String getRealPath(String base64) {
return new String(Base64.decode(base64.getBytes(), Base64.DEFAULT));
}
private Video updateVideo(Video video) {
video.main_url = getRealPath(video.main_url);
return video;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Video>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
onDecodeError(e);
}
@Override
public void onNext(Video s) {
onSuccess(s);
}
});
}
public abstract void onSuccess(Video s);
public abstract void onDecodeError(Throwable e);
private String getRandom() {
Random random = new Random();
StringBuilder result = new StringBuilder();
for (int i = 0; i < 16; i++) {
result.append(random.nextInt(10));
}
return result.toString();
}
}